"""
狗类
"""
class Dog():
    # 在类的代码块中可以定义变量，来表示实例的公共属性
    """
    属性的调用：类.属性
    """
    name="bob"
    age=3
    # 在类中可以定义函数，表示这个属性的公有方法
    """
    方法的调用 类.方法()
    方法调用和函数调用的区别
        方法调用默认都有一个self参数，所以只要你调用至少都会传一个参数，这个你调用不用传，
        但是定义的时候要定义出来
        函数没有默认参数的概念，所以有多少个参数你就能传递多少个
    """
    def sit(self):
        print("坐下",self.name)


dog = Dog()
print(dog.name)
print(dog.sit())

"""
类的加载机制：python和java
    java类的加载机制:-面试常问的双亲委派机制
        双亲委派-三级加载器（BootStrap，ExtClassLoader，AppClassLoader）
        流程：首先classLoader读取到class文件的类名-委托给AppClassLoader,AppClassLoader得到指令后首先第一步是委托给
            上一级的ExtClassLoader去加载，ExtClassLoader得到指令后首先第一步也是委托给上一级的BootStrap去加载
            当bootStrap加载到类，那么流程结束。如果bootStrap没有加载到类然后二级的ExtClassLoader才会进行加载，
            二级也没有加载到。那么三级的AppClassLoader加载。三级没有加载到才是之定义的classLoader进行加载
            这种拿到类先网上指派去加载的方式就叫做双亲委派
        优势: 这三个类没有继承关系，但是却又执行的等级问题。越是基础的类就越要被上层的加载器加载，加载前先询问父级是否加载，
            保证java程序的稳定运行，不会被重复加载
    python的加载机制：
        动态加载：所有的python模块加载到内存中后，都存放在sys.modules中
            在其他地方引入该模块的时候，需要先去sys.modules中查找是否有该模块。有就不加载直接调用到自己的命名空间中
            如果没有，那么就会按照sys.path去指定位置加载到内存中方便其他调用
        优势:都存放在内存中，保证不会重复加载。类似于node.js的包引入这个概念
"""
"""
属性和方法的加载机制:
    1.对象的对象方法的加载机制是首先读取对象的属性或者方法
        如果有对象的属性或者方法，直接返回
    2.如果对象的属性或者方法没有,那么就回去找对应类对象的属性和方法
        类对象的属性和方法有。没有找到就报错
什么时候定义为类：共有的属性和方法就需要创建为类
"""
dog1=Dog()
dog2=Dog();
dog1.name="lucy"
dog1.age=3
print(dog1.age)
print(dog2.name)
print(dog1.sit())

"""
构造方法：属性不赋值不报错，但是很多方法有用到了属性
    一旦对象创建后不赋值，那么就会导致调用方法是需要用到属性的地方会报错
    python中定义很多特殊方法 -magic 
    _init_(self),这个方法和java无参构造方法一样
     def __init__(self,name,age,sex): 这个和java里面的全参构造方法
    特殊方法什么时候调用:特殊方法不需要尝试调用，会在特殊时候自己调用
"""

class Cat():
    def __init__(self):
        pass

    # 初始化属性
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    # 方法
    def setAge(self,age):
        self.age=age


cat1 = Cat("bob",3,"男")
cat2 = Cat("green",3,"男")
print(cat1.name)
print(cat2.name)
cat2.setAge(55)
print(cat2.age)